package org.smr.ministore.entities;

import org.apache.commons.collections4.CollectionUtils;
import org.blade.entities.base.BizTreeEntity;
import org.smr.ministore.entities.vo.Assign2OrgansVO;
import org.smr.ministore.entities.vo.OrganVO;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * GoodsType实体,对应表：t_goods_type
**/
public class GoodsType extends BizTreeEntity<Long> {


	public static final int HAS_CHILD_NODE = -40;

	public static final int ZERO = 0;


	/**
	* 分类名称
	**/
	private java.lang.String typeName;

	/**
	 * 设置分类名称的值
	 * @param typeName
	**/
	public void  setTypeName(java.lang.String typeName){
		this.typeName = typeName;
	}
	/**
	 * 获取分类名称的值
	**/
	public  java.lang.String getTypeName(){
		return this.typeName;
	}



	


	/**
	* 分类路径
	**/
	private java.lang.String typePath;

	/**
	 * 设置分类路径的值
	 * @param typePath
	**/
	public void  setTypePath(java.lang.String typePath){
		this.typePath = typePath;
	}
	/**
	 * 获取分类路径的值
	**/
	public  java.lang.String getTypePath(){
		return this.typePath;
	}




	/**
	* 分类排序
	**/
	private java.lang.Integer sort;

	/**
	 * 设置分类排序的值
	 * @param sort
	**/
	public void  setSort(java.lang.Integer sort){
		this.sort = sort;
	}
	/**
	 * 获取分类排序的值
	**/
	public  java.lang.Integer getSort(){
		return this.sort;
	}



	


	/**
	* 是否删除
	**/
	private boolean isDeleted;

	/**
	 * 设置是否删除的值
	 * @param isDeleted
	**/
	public void setIsDeleted(boolean isDeleted){
		this.isDeleted = isDeleted;
	}
	/**
	 * 获取是否删除的值
	**/
	public boolean getIsDeleted(){
		return this.isDeleted;
	}



	


	/**
	* 创建者
	**/
	private java.lang.Long createBy;

	/**
	 * 设置创建者的值
	 * @param createBy
	**/
	public void  setCreateBy(java.lang.Long createBy){
		this.createBy = createBy;
	}
	/**
	 * 获取创建者的值
	**/
	public  java.lang.Long getCreateBy(){
		return this.createBy;
	}



	


	/**
	* 创建时间
	**/
	private java.util.Date createDate;

	/**
	 * 设置创建时间的值
	 * @param createDate
	**/
	public void  setCreateDate(java.util.Date createDate){
		this.createDate = createDate;
	}
	/**
	 * 获取创建时间的值
	**/
	public  java.util.Date getCreateDate(){
		return this.createDate;
	}



	
    /**
    * 创建时间 查询时间开始
    **/
    private java.util.Date createDateStart;

    /**
    * 创建时间 查询时间结束
    **/
    private java.util.Date createDateEnd;


    /**
    * 设置创建时间Start的值
    * @param createDateStart
    **/
    public void  setCreateDateStart(java.util.Date createDateStart){
    this.createDateStart = createDateStart;
    }
    /**
    * 获取创建时间Start的值
    **/
    public  java.util.Date getCreateDateStart(){
    return this.createDateStart;
    }

    /**
    * 设置创建时间End的值
    * @param createDateEnd
    **/
    public void  setCreateDateEnd(java.util.Date createDateEnd){
    this.createDateEnd = createDateStart;
    }
    /**
    * 获取创建时间End的值
    **/
    public  java.util.Date getCreateDateEnd(){
    return this.createDateEnd;
    }

    


	/**
	* 修改者
	**/
	private java.lang.Long updateBy;

	/**
	 * 设置修改者的值
	 * @param updateBy
	**/
	public void  setUpdateBy(java.lang.Long updateBy){
		this.updateBy = updateBy;
	}
	/**
	 * 获取修改者的值
	**/
	public  java.lang.Long getUpdateBy(){
		return this.updateBy;
	}



	


	/**
	* 修改时间
	**/
	private java.util.Date updateDate;

	/**
	 * 设置修改时间的值
	 * @param updateDate
	**/
	public void  setUpdateDate(java.util.Date updateDate){
		this.updateDate = updateDate;
	}
	/**
	 * 获取修改时间的值
	**/
	public  java.util.Date getUpdateDate(){
		return this.updateDate;
	}



	
    /**
    * 修改时间 查询时间开始
    **/
    private java.util.Date updateDateStart;

    /**
    * 修改时间 查询时间结束
    **/
    private java.util.Date updateDateEnd;


    /**
    * 设置修改时间Start的值
    * @param updateDateStart
    **/
    public void  setUpdateDateStart(java.util.Date updateDateStart){
    this.updateDateStart = updateDateStart;
    }
    /**
    * 获取修改时间Start的值
    **/
    public  java.util.Date getUpdateDateStart(){
    return this.updateDateStart;
    }

    /**
    * 设置修改时间End的值
    * @param updateDateEnd
    **/
    public void  setUpdateDateEnd(java.util.Date updateDateEnd){
    this.updateDateEnd = updateDateStart;
    }
    /**
    * 获取修改时间End的值
    **/
    public  java.util.Date getUpdateDateEnd(){
    return this.updateDateEnd;
    }

    


	/**
	* 备注
	**/
	private java.lang.String remark;

	/**
	 * 设置备注的值
	 * @param remark
	**/
	public void  setRemark(java.lang.String remark){
		this.remark = remark;
	}
	/**
	 * 获取备注的值
	**/
	public  java.lang.String getRemark(){
		return this.remark;
	}


	public List<GoodsTypeOrgan> assigneToOrgans(Assign2OrgansVO assign2Organs){
		if(Objects.isNull(assign2Organs)) {
			return Collections.EMPTY_LIST;
		}
		List<OrganVO> organs = assign2Organs.getAssignees();
		if(CollectionUtils.isEmpty(organs)) {
			return Collections.EMPTY_LIST;
		}

		List<GoodsTypeOrgan> goodsTypeOrgans = organs.parallelStream().map(organ->{
			GoodsTypeOrgan goodsTypeOrgan = new GoodsTypeOrgan();
			goodsTypeOrgan.setGoodsTypeId(assign2Organs.getId());
			goodsTypeOrgan.setOrganId(organ.getOrganId());
			goodsTypeOrgan.setTenantId(assign2Organs.getTenantId());
			goodsTypeOrgan.setBelongToOrganId(organ.getOrganId());
			goodsTypeOrgan.setOrganPath(assign2Organs.getOrganPath());
			return goodsTypeOrgan;
		}).collect(Collectors.toList());

		return goodsTypeOrgans;
	}

    /**
     * 获取需要保存的商品类型组织关系
     *
     * @param goodsTypeOrgansPersistence
     * @param goodsTypeOrgans
     * @return
     */
	public List<GoodsTypeOrgan> getGoodsTypeOrganWant2Save(
	        List<GoodsTypeOrgan> goodsTypeOrgansPersistence, List<GoodsTypeOrgan> goodsTypeOrgans ){
		Set<Long> organIds = goodsTypeOrgansPersistence.parallelStream().map(goodsTypeOrgan ->{
			return goodsTypeOrgan.getOrganId();
		}).collect(Collectors.toSet());

		List<GoodsTypeOrgan> goodsTypeOrgansWant2Save =  goodsTypeOrgans.stream().filter(goodsTypeOrgan -> {
			return !organIds.contains(goodsTypeOrgan.getOrganId());
		}).collect(Collectors.toList());
		return goodsTypeOrgansWant2Save;
	}


}